<?php
/**
 ****************************************
 * Nova 入口文件
 *
 * @update:  2009-10-20
 * @version: 0.9.002
 ****************************************
**/

// 清除不需要的变量
$defined_vars = get_defined_vars();
foreach ( $defined_vars as $key => $value ) {
	if (!in_array($key,array('_POST','_GET','_COOKIE','_SERVER','_FILES'))) {
		${$key} = '';
		unset(${$key});
	}
}
unset( $defined_vars, $value, $key );

// Nova Begins！o(∩_∩)o...
$_NOVA = array();

// 初始运行时刻
$_NOVA['RUN_TIME']['NOVA_START'] = microtime( TRUE );

// 初始占用内存空间
if( function_exists( 'memory_get_usage' ) ) {
	$_NOVA['RUN_MEM']['NOVA_START'] = memory_get_usage();
}

// 定义 Nova 运行标志
define( 'IN_NOVA', TRUE );

define( 'PHP_TIME', time() );

// 定义 Nova 安装路径
define( 'NOVA_ROOT', str_replace( '\\', '/', dirname( __FILE__ ) ) . '/' );

// 定义 Nova 目录结构
define( 'NOVA_CORE'  , NOVA_ROOT . 'core/' );
define( 'NOVA_CACHE' , NOVA_ROOT . 'cache/' );
define( 'NOVA_LANG'  , NOVA_ROOT . 'language/' );
define( 'NOVA_LOG'   , NOVA_ROOT . 'log/' );
define( 'NOVA_LIB'   , NOVA_ROOT . 'lib/' );

// Nova 系统文件列表
$_NOVA['FILES'] = array(
	NOVA_CORE . 'function.php',
	NOVA_CORE . 'base.class.php',
	NOVA_CORE . 'exception.class.php',
	NOVA_CORE . 'cache.class.php',
	NOVA_CORE . 'database.class.php',
	NOVA_CORE . 'request.class.php',
	NOVA_CORE . 'application.class.php',
	NOVA_CORE . 'user.class.php',
	NOVA_CORE . 'template.class.php',
);
if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
	$_NOVA['FILES'][] = NOVA_CORE . 'log.class.php';
}

// 载入系统文件
$_NOVA['RUN_TIME']['CORE'] = microtime( TRUE );
if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
	foreach( $_NOVA['FILES'] as $file ) {
		include( $file );
	}
} else {
	if( !is_file( NOVA_CACHE . '~nova.php' ) ) {
		// 生成编译缓存
		include( NOVA_CORE . 'compile.class.php' );
		$compile = new Compile();
		$compile->build( NOVA_CACHE, $_NOVA['FILES'], 'nova' );
		unset( $compile );
	}
	include( NOVA_CACHE . '~nova.php' );
}
$_NOVA['RUN_TIME']['CORE'] = microtime( TRUE ) - $_NOVA['RUN_TIME']['CORE'];

// 自动设定 APP_PATH
if( !defined( 'APP_PATH' ) ) {
	define( 'APP_PATH', get_path() . '/' );
}

// 开启输出缓存
obstart();

// 开启用户会话
session_start();

// 设定时区
if( function_exists('date_default_timezone_set') && defined( 'APP_TIMEZONE' ) ) {
	date_default_timezone_set( APP_TIMEZONE );
}

// 设置语言
if( !defined( 'APP_LANG' ) ) {
	define( 'APP_LANG', 'zh-cn' );
}
$_NOVA['language'] = check_language();

// 载入语言包
if( !is_file( NOVA_LANG . $_NOVA['language'] . '.php' ) ) {
	$_NOVA['language'] = APP_LANG;
}
$_LANGUAGE = array();
include( NOVA_LANG . $_NOVA['language'] . '.php' );
if( isset( $lang ) && is_array( $lang ) ) {
	$_LANGUAGE = array_merge( $_LANGUAGE, $lang );
	unset( $lang );
}

// 实例化内核类
if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
	$log  = new Log();
}
$user     = new User();
$request  = new Request();
//$db     = new Database();
$db       = new mysql();
//$templaet = new Template();

// Nova 加载完成时刻
$_NOVA['RUN_TIME']['NOVA_END'] = microtime( TRUE );
// 加载完成时刻占用内存空间
if( function_exists( 'memory_get_usage' ) ) {
	$_NOVA['RUN_MEM']['NOVA_END'] = memory_get_usage();
}

$cache    = connect_cache( CACHE_TYPE /*, $options = array()*/ );

// 处理未能捕获的程序异常
// 在这个异常处理程序被调用后，程序会停止执行
function nova_exception( $e ) {
	$e->__toString();
}
//set_exception_handler( 'nova_exception' );

// 处理程序错误
// 不是所有的错误都能被捕获
function nova_error( $errno, $errstr, $errfile, $errline ) {
	// 直接抛出异常
	throw new NovaErrorException( $errstr, 0, $errno, $errfile, $errline );
}
//set_error_handler( 'nova_error' );

if( !defined( 'APP_NAME' ) || !defined( 'APP_ROOT' ) ) {
	throw new NovaException( L( '_APP_CONFIG_UNDEFINED_' ), E_ERROR );
}
// 自动加载
if( !defined( 'APP_AUTOLOAD' ) || !is_dir( APP_AUTOLOAD ) ) {
	define( 'APP_AUTOLOAD', APP_ROOT . 'app/' );
}





// 检查 Nova 运行环境
// 优化：初次运行时运行一次即可
$_NOVA['ENVIRONMENT'] = array(
	// 系统环境
	'SYSTEM' => array(
		'PHP_OS'      => PHP_OS,
		'PHP_VERSION' => PHP_VERSION,
	),
	// PHP 扩展支持
	'SUPPORT' => array(
		'MYSQL' => function_exists( 'mysql_connect' ),
		'GD'    => function_exists( 'imagecreate' ),
		'SHMOP' => function_exists( 'shmop_open' ),
	),
);
?>
